/**
 * 
 */
package cc.comac.mom.datahandlers.entity;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.bean.EquipSparePartsDue;
import cc.comac.mom.bean.EquipSparePartsDueBean;
import cc.comac.mom.bean.ResultDev;
import cc.comac.mom.dao.entity.EquipDevDao;
import cc.comac.mom.dao.entity.EquipSparePartEquipRelationDao;
import cc.comac.mom.dao.entity.EquipSparePartMasterDataDao;
import cc.comac.mom.dao.entity.EquipSparePartsDueDao;
import cc.comac.mom.entity.EquipDevEntity;
import cc.comac.mom.entity.EquipSparePartEquipRelationEntity;
import cc.comac.mom.entity.EquipSparePartMasterDataEntity;
import cc.comac.mom.entity.EquipSparePartsDueEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
import cc.comac.mom.util.ResultBean;

/**
* @Description: 备件到期
* @author: fyt 
* @date: 2020年7月15日上午11:16:31
*/
/**
 * @Description:
 * @author: fyt
 * @date: 2020年7月15日下午6:33:28
 */
@Component
@Transactional
public class EquipSparePartsDueDataHandler extends ServiceImpl<EquipSparePartsDueDao, EquipSparePartsDueEntity> {

	@Autowired
	private EquipSparePartsDueDao equipSparePartsDueDao;

	@Autowired
	private EquipSparePartMasterDataDao equipSparePartMasterDataDao;

	@Autowired
	private EquipDevDao equipDevDao;

	@Autowired
	private EquipSparePartEquipRelationDao equipSparePartEquipRelationDao;
	@Autowired
	private BaseEntityDataUtil baseEntityDataUtil;

	/**
	 * 
	 * @Title: saveOrUpdate
	 * @Description: 新增时如果数据已存在则删除已存在数据，再执行新增操作，如果不存在，则执行新增操作
	 * @param obj
	 * @return
	 *
	 */
	public ResultBean save(EquipSparePartsDue obj) {

		ResultBean resultBean = new ResultBean(true);
		ResultBean checkDatas = this.checkDatas(obj);
		if (!checkDatas.success) {
			return checkDatas;
		}
		EquipSparePartsDueEntity innerData = obj.getInnerData();
		// 根据备件编码查询备件主数据
		HashMap<String, Object> mapSelectEquipSparePartMaster = new HashMap<String, Object>();
		mapSelectEquipSparePartMaster.put("row_status", 1);
		mapSelectEquipSparePartMaster.put("spare_part_number", innerData.getPartNumber());

		List<EquipSparePartMasterDataEntity> listEquipSparePartMasterData = equipSparePartMasterDataDao
				.selectByMap(mapSelectEquipSparePartMaster);
		if (listEquipSparePartMasterData == null || listEquipSparePartMasterData.size() < 1) {
			throw new RuntimeException("无法获取备品备件编号为：" + innerData.getPartNumber() + "的主数据信息");
		}
		// 根据设备编号获取设备主数据信息
		HashMap<String, Object> mapEquipDev = new HashMap<String, Object>();
		mapEquipDev.put("row_status", 1);
		mapEquipDev.put("dev_number", innerData.getDevNumber());
		List<EquipDevEntity> listEquipDevEntity = equipDevDao.selectByMap(mapEquipDev);
		if (listEquipDevEntity == null || listEquipDevEntity.size() < 1) {
			throw new RuntimeException("无法获取设备编号为：" + innerData.getDevNumber() + "的主数据信息");
		}
		// 根据设备主数据id和备件主数据Id获取设备关联信息
		HashMap<String, Object> map4 = new HashMap<String, Object>();
		map4.put("row_status", 1);
		map4.put("spare_part_id", listEquipSparePartMasterData.get(0).getId());
		map4.put("equip_dev_id", listEquipDevEntity.get(0).getId());
		List<EquipSparePartEquipRelationEntity> selectByMap4 = equipSparePartEquipRelationDao.selectByMap(map4);
		// 设备使用周期
		int lifeCycle = 0;
		long daysRemain = 0;
		if (selectByMap4 != null && selectByMap4.size() > 0) {
			lifeCycle = (int) selectByMap4.get(0).getLifeCycle();
		}
		if (lifeCycle > 0) {
			LocalDateTime nextDate = innerData.getReplacementTime().plusDays(lifeCycle);
			innerData.setNextDate(nextDate);
			Duration duration = Duration.between(LocalDateTime.now(), nextDate);
			long seconds = duration.getSeconds();
			daysRemain = (seconds) / 86400;
		}
		// 剩余天数
		innerData.setDaysRemain(daysRemain);
		// 查询当前数据是否存在，如果数据已存在则删除已存在数据，再执行新增操作，如果不存在，则执行新增操作
		HashMap<String, Object> mapEquipSparePartsDue = new HashMap<String, Object>();
		mapEquipSparePartsDue.put("row_status", 1);
		mapEquipSparePartsDue.put("dev_number", innerData.getDevNumber());
		mapEquipSparePartsDue.put("part_number", innerData.getPartNumber());
		mapEquipSparePartsDue.put("benchmark_dev_part", innerData.getBenchmarkDevPart());
		List<EquipSparePartsDueEntity> listEquipSparePartsDueEntity = equipSparePartsDueDao
				.selectByMap(mapEquipSparePartsDue);
		if (listEquipSparePartsDueEntity != null && listEquipSparePartsDueEntity.size() > 0) {
			// 存在则执行删除操作
			baseEntityDataUtil.deleteBaseEntityData(listEquipSparePartsDueEntity.get(0));
			int delete = equipSparePartsDueDao.updateById(listEquipSparePartsDueEntity.get(0));
			if (delete < 1) {
				throw new RuntimeException("新增失败");
			}
		}

		baseEntityDataUtil.setBaseEntityData(innerData);
		int insert = equipSparePartsDueDao.insert(innerData);
		if (insert < 1) {
			throw new RuntimeException("新增失败");
		}
		return resultBean;
	}

	//批量新增
	public ResultBean save(List<EquipSparePartsDue> list) {
		ResultBean resultBean = new ResultBean(true);
		if(list == null || list.size()<1) {
			throw new RuntimeException("数据为空");	
		}
		ArrayList<EquipSparePartsDueEntity> listEntity = new ArrayList<EquipSparePartsDueEntity>();
		for(EquipSparePartsDue item :list) {
			ResultBean checkDatas = this.checkDatas(item);
			if (!checkDatas.success) {
				return checkDatas;
			}
			EquipSparePartsDueEntity innerData = item.getInnerData();
			// 根据备件编码查询备件主数据
			HashMap<String, Object> mapSelectEquipSparePartMaster = new HashMap<String, Object>();
			mapSelectEquipSparePartMaster.put("row_status", 1);
			mapSelectEquipSparePartMaster.put("spare_part_number", innerData.getPartNumber());

			List<EquipSparePartMasterDataEntity> listEquipSparePartMasterData = equipSparePartMasterDataDao
					.selectByMap(mapSelectEquipSparePartMaster);
			if (listEquipSparePartMasterData == null || listEquipSparePartMasterData.size() < 1) {
				throw new RuntimeException("无法获取备品备件编号为：" + innerData.getPartNumber() + "的主数据信息");
			}
			// 根据设备编号获取设备主数据信息
			HashMap<String, Object> mapEquipDev = new HashMap<String, Object>();
			mapEquipDev.put("row_status", 1);
			mapEquipDev.put("dev_number", innerData.getDevNumber());
			List<EquipDevEntity> listEquipDevEntity = equipDevDao.selectByMap(mapEquipDev);
			if (listEquipDevEntity == null || listEquipDevEntity.size() < 1) {
				throw new RuntimeException("无法获取设备编号为：" + innerData.getDevNumber() + "的主数据信息");
			}
			// 根据设备主数据id和备件主数据Id获取设备关联信息
			HashMap<String, Object> map4 = new HashMap<String, Object>();
			map4.put("row_status", 1);
			map4.put("spare_part_id", listEquipSparePartMasterData.get(0).getId());
			map4.put("equip_dev_id", listEquipDevEntity.get(0).getId());
			List<EquipSparePartEquipRelationEntity> selectByMap4 = equipSparePartEquipRelationDao.selectByMap(map4);
			// 设备使用周期
			int lifeCycle = 0;
			long daysRemain = 0;
			if (selectByMap4 != null && selectByMap4.size() > 0) {
				lifeCycle = (int) selectByMap4.get(0).getLifeCycle();
			}
			if (lifeCycle > 0) {
				LocalDateTime nextDate = innerData.getReplacementTime().plusDays(lifeCycle);
				innerData.setNextDate(nextDate);
				Duration duration = Duration.between(LocalDateTime.now(), nextDate);
				long seconds = duration.getSeconds();
				daysRemain = (seconds) / 86400;
			}
			// 剩余天数
			innerData.setDaysRemain(daysRemain);
			// 查询当前数据是否存在，如果数据已存在则删除已存在数据，再执行新增操作，如果不存在，则执行新增操作
			HashMap<String, Object> mapEquipSparePartsDue = new HashMap<String, Object>();
			mapEquipSparePartsDue.put("row_status", 1);
			mapEquipSparePartsDue.put("dev_number", innerData.getDevNumber());
			mapEquipSparePartsDue.put("part_number", innerData.getPartNumber());
			mapEquipSparePartsDue.put("benchmark_dev_part", innerData.getBenchmarkDevPart());
			List<EquipSparePartsDueEntity> listEquipSparePartsDueEntity = equipSparePartsDueDao
					.selectByMap(mapEquipSparePartsDue);
			if (listEquipSparePartsDueEntity != null && listEquipSparePartsDueEntity.size() > 0) {
				// 存在则执行删除操作
				baseEntityDataUtil.deleteBaseEntityData(listEquipSparePartsDueEntity.get(0));
				int delete = equipSparePartsDueDao.updateById(listEquipSparePartsDueEntity.get(0));
				if (delete < 1) {
					throw new RuntimeException("新增失败");
				}
			}
			listEntity.add(innerData);
		}
		for(EquipSparePartsDueEntity item2:listEntity) {
			baseEntityDataUtil.setBaseEntityData(item2);
		}
		boolean saveBatch = this.saveBatch(listEntity);
		if(!saveBatch) {
			throw new RuntimeException("保存备件更换信息失败");
		}
		return resultBean;
	}
	//查询
	public ResultDev selectByFields(EquipSparePartsDueBean obj) {
		ResultDev resultDev = new ResultDev();
		if (obj.getPageSize() == 0) {
			obj.setPageSize(10);
		}
		obj.setPageNum((obj.getPageNum()-1)*obj.getPageSize());
		List<EquipSparePartsDueBean> listEquipRegularCheckPlanBean = equipSparePartsDueDao.selectByFields(obj);
		long countByFields = equipSparePartsDueDao.selectCountByFields(obj);
		
		// 将查询总数除以每页数量后向上取整获取总页数
		double pageCount = Math.ceil((double)countByFields / obj.getPageSize());
		resultDev.setEntityList(listEquipRegularCheckPlanBean);
		resultDev.setPageCount((int)pageCount);
		resultDev.setTotalQuantity((int)countByFields);
		return resultDev;
	}
	//查询
	public ResultDev selectByCondition(EquipSparePartsDue obj) {
		QueryWrapper<EquipSparePartsDueEntity> queryWrapper = new QueryWrapper<EquipSparePartsDueEntity>();
		queryWrapper.eq("row_status", 1);
		if (obj != null && obj.getInnerData() != null) {
			if (obj.getInnerData().getPartNumber() != null && !"".equals(obj.getInnerData().getPartNumber())) {
				queryWrapper.like("part_number", obj.getInnerData().getPartNumber());
			}
//			if (obj.getInnerData().getPartName() != null && !"".equals(obj.getInnerData().getPartName())) {
//				queryWrapper.like("part_name", obj.getInnerData().getPartName());
//			}
			if (obj.getInnerData().getSpecifications() != null && !"".equals(obj.getInnerData().getSpecifications())) {
				queryWrapper.like("specifications", obj.getInnerData().getSpecifications());
			}
			if (obj.getInnerData().getMaterialType() != null && !"".equals(obj.getInnerData().getMaterialType())) {
				queryWrapper.like("material_type", obj.getInnerData().getMaterialType());
			}
//			if (obj.getInnerData().getWorkShop() != null && !"".equals(obj.getInnerData().getWorkShop())) {
//				queryWrapper.like("work_shop", obj.getInnerData().getWorkShop());
//			}
			if (obj.getInnerData().getDevNumber() != null && !"".equals(obj.getInnerData().getDevNumber())) {
				queryWrapper.like("dev_number", obj.getInnerData().getDevNumber());
			}
//			if (obj.getInnerData().getDevName() != null && !"".equals(obj.getInnerData().getDevName())) {
//				queryWrapper.like("dev_name", obj.getInnerData().getDevName());
//			}
//			if (obj.getInnerData().getReplacementType() != null
//					&& !"".equals(obj.getInnerData().getReplacementType())) {
//				queryWrapper.like("replacement_type", obj.getInnerData().getReplacementType());
//			}
			if (obj.getInnerData().getBenchmarkDevPart() != null
					&& !"".equals(obj.getInnerData().getBenchmarkDevPart())) {
				queryWrapper.like("benchmark_dev_part", obj.getInnerData().getBenchmarkDevPart());
			}
			if (obj.getReplacementTimeBegin() != null && obj.getReplacementTimeEnd() != null) {
				queryWrapper.between("replacement_time", obj.getReplacementTimeBegin(), obj.getReplacementTimeEnd());
			}
			if (obj.getNextDateBegin() != null && obj.getNextDateEnd() != null) {
				queryWrapper.between("next_date", obj.getNextDateBegin(), obj.getNextDateEnd());
			}
		}
		if (obj.getPageSize() == 0) {
			obj.setPageSize(10);
		}
		Page<EquipSparePartsDueEntity> page = new Page<>(obj.getPageNum(), obj.getPageSize(), true);
		IPage<EquipSparePartsDueEntity> iPage = equipSparePartsDueDao.selectPage(page, queryWrapper);
		List<EquipSparePartsDueEntity> list = iPage.getRecords();
		ResultDev resultDev = new ResultDev();
		resultDev.setEntityList(list);
		resultDev.setTotalQuantity((int)iPage.getTotal());
		resultDev.setPageCount((int)iPage.getPages());
		return resultDev;

	}

	public ResultBean checkDatas(EquipSparePartsDue obj) {
		ResultBean resultBean = new ResultBean(true);
		if (obj == null || obj.getInnerData() == null) {
			throw new RuntimeException("数据为空");
		}
		if (obj.getInnerData().getReplacementType() == null || "".equals(obj.getInnerData().getReplacementType())) {
			throw new RuntimeException("单据类型为空");
		}
		if (obj.getInnerData().getPartNumber() == null || "".equals(obj.getInnerData().getPartNumber())) {
			throw new RuntimeException("备件编号为空");
		}
		if (obj.getInnerData().getDevNumber() == null || "".equals(obj.getInnerData().getDevNumber())) {
			throw new RuntimeException("设备编号为空");
		}
		if (obj.getInnerData().getBenchmarkDevPart() == null || "".equals(obj.getInnerData().getBenchmarkDevPart())) {
			throw new RuntimeException("部位为空");
		}

		if (obj.getInnerData().getReplacementTime() == null) {
			throw new RuntimeException("更换日期为空");
		}

		if (obj.getInnerData().getReplacementNumber() == 0) {
			throw new RuntimeException("更换数量为空");
		}

		return resultBean;

	}

//	@Scheduled(cron = "30 30 9 * * ?")
//	@Async
//	public void scheduled() {
//		System.out.println(LocalDateTime.now()+"-----定时任务");
//		HashMap<String, Object> map = new HashMap<String, Object>();
//		map.put("row_status", 1);
//		List<EquipSparePartsDueEntity> selectByMap = equipSparePartsDueDao.selectByMap(map);
//		if (selectByMap == null || selectByMap.size() < 1) {
//			return;
//		}
//		ArrayList<EquipSparePartsDueEntity> listUpdateEntity = new ArrayList<EquipSparePartsDueEntity>();
//		for (EquipSparePartsDueEntity item : selectByMap) {
//			// 根据备件编码查询备件主数据
//			HashMap<String, Object> mapSelectEquipSparePartMaster = new HashMap<String, Object>();
//			mapSelectEquipSparePartMaster.put("row_status", 1);
//			mapSelectEquipSparePartMaster.put("spare_part_number", item.getPartNumber());
//
//			List<EquipSparePartMasterDataEntity> listEquipSparePartMasterData = equipSparePartMasterDataDao
//					.selectByMap(mapSelectEquipSparePartMaster);
//			if (listEquipSparePartMasterData == null || listEquipSparePartMasterData.size() < 1) {
//
//				// 记录日志
//				continue;
//			}
//			// 根据设备编号获取设备主数据信息
//			HashMap<String, Object> mapEquipDev = new HashMap<String, Object>();
//			mapEquipDev.put("row_status", 1);
//			mapEquipDev.put("dev_number", item.getDevNumber());
//			List<EquipDevEntity> listEquipDevEntity = equipDevDao.selectByMap(mapEquipDev);
//			if (listEquipDevEntity == null || listEquipDevEntity.size() < 1) {
//				// 记录日志
//				continue;
//			}
//			// 根据设备主数据id和备件主数据Id获取设备关联信息
//			HashMap<String, Object> map2 = new HashMap<String, Object>();
//			map2.put("row_status", 1);
//			map2.put("spare_part_id", listEquipSparePartMasterData.get(0).getId());
//			map2.put("equip_dev_id", listEquipDevEntity.get(0).getId());
//			List<EquipSparePartEquipRelationEntity> selectByMap4 = equipSparePartEquipRelationDao.selectByMap(map2);
//			if (selectByMap4 == null || selectByMap4.size() < 1) {
//				// 主数据绑定信息不存在
//				if (item.getNextDate() != null) {
//					// 主数据绑定信息不存在,下次更换日期不为空
//					Duration duration = Duration.between(LocalDateTime.now(), item.getNextDate());
//					long seconds = duration.getSeconds();
//					long daysRemain = (seconds) / 86400;
//					item.setDaysRemain(daysRemain);
//					if (daysRemain < 0) {
//						// 主数据绑定信息不存在，下次更换日期不为空,如果剩余日期小于0，则删除该条数据
//						baseEntityDataUtil.deleteBaseEntityData(item);
//					//	equipSparePartsDueDao.updateById(item);
//						listUpdateEntity.add(item);
//					} else {
//						// 主数据绑定信息不存在，下次更换日期不为空，如果剩余日期大于0，则修改该条数据
//						baseEntityDataUtil.updateBaseEntityData(item);
//					//	equipSparePartsDueDao.updateById(item);
//						listUpdateEntity.add(item);
//					}
//
//				}
//			} else {
//				// 主数据绑定信息存在,如果使用周期存在，则用该周期计算新的下次更新日期和剩余天数
//				if (selectByMap4.get(0).getLifeCycle() > 0) {
//					LocalDateTime nextDate = item.getReplacementTime().plusDays(selectByMap4.get(0).getLifeCycle());
//					Duration duration = Duration.between(LocalDateTime.now(), nextDate);
//					long seconds = duration.getSeconds();
//					long daysRemain = (seconds) / 86400;
//					item.setDaysRemain(daysRemain);
//					item.setNextDate(nextDate);
//					baseEntityDataUtil.updateBaseEntityData(item);
//					//equipSparePartsDueDao.updateById(item);
//					listUpdateEntity.add(item);
//					continue;
//				} else {
//					if(item.getNextDate() != null) {
//						Duration duration = Duration.between(LocalDateTime.now(), item.getNextDate());
//						long seconds = duration.getSeconds();
//						long daysRemain = (seconds) / 86400;
//						item.setDaysRemain(daysRemain);
//						baseEntityDataUtil.updateBaseEntityData(item);
//						//equipSparePartsDueDao.updateById(item);
//						listUpdateEntity.add(item);
//					}
//				}
//			}
//			// 记录日志
//			continue;
//		}
//		//批量修改
//		if(listUpdateEntity != null && listUpdateEntity.size()>0) {
//			this.updateBatchById(listUpdateEntity);
//		}
//
//	}
}
